package db.entity;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;

import db.BaseDAO;
import db.DAOFactory;
import db.Transaction;
import db.TransformInterface;

import model.Role;
import model.User;
import model.relation.UserGroup;

/**
 * 
 * Description: 对用户数据进行处理的DAO。
 *  
 * @since  2009/2/23
 * @author ashen
 * 
 */
public class UserDAO extends BaseDAO implements TransformInterface<User>{
	
	public UserDAO(){
		setTableName("userscheme.usertable");
	}
	
	/**
	 * the method save of class UserDAO
	 * 
	 * 该方法将参数用户对象存储到数据库
	 * 
	 * @param user 需要保存的用户对象
	 * @return 返回操作成功与否
	 */
	public boolean save(User user){		
		Transaction transaction=new Transaction();
		save(object2HashMap(user),transaction);
		
		int userId = DAOFactory.getUserDAO().findByName(user.getName(),transaction).getId();
		UserGroup userGroup=
			new UserGroup(DAOFactory.getRoleDAO().findById(2,transaction),userId);
		DAOFactory.getUserGroupDAO().save(userGroup,transaction);
		return transaction.commit();
	}
	
	/**
	 * the method update of class UserDAO 
	 * 
	 * 该方法将参数用户对象更新到数据库
	 * 
	 * @param user 需要更新的User对象
	 * @return 返回操作成功与否
	 */
	public boolean update(User user){
		return update(object2HashMap(user),"ID");
	}
	
	/**
	 * the method delete of class UserDAO
	 * 
	 * 该方法删除指定ID的用户
	 * 
	 * @param id 需要删除的用户的ID
	 */
	public boolean delete(int id){
		return delete("id",id);
	}

	/**
	 * the method findAll of class UserDAO
	 * 
	 * 该方法返回所有用户
	 * 
	 * @return ArrayList<User>类型，返回数据中所有景点
	 */
	public ArrayList<User> findAll(){
		Transaction transaction=new Transaction();
		ArrayList<User> list= list2ObjectList(super.findAllBase(transaction));		
		transaction.close();
		return list;
	}
	
	/**
	 * the method findById of class UserDAO
	 * 
	 * 该方法通过指定用户ID查找用户
	 * 
	 * @param id 用户ID
	 * @return 查询到的用户
	 */
	public User findById(int id){	
		Transaction transaction=new Transaction();
		User user= hashMap2Object(findByPK("id",id,transaction));
		transaction.close();
		return user;
	}
	
	/**
	 * the method findByName of class UserDAO
	 * 
	 * 该方法通过指定用户名称查找用户，用户名不可重复
	 * 
	 * @param name 用户名称
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的用户
	 */
	public User findByName(String name,Transaction transaction){	        		 	        
		return hashMap2Object(findByPK("name",getFormatString(name),transaction));
	}
	
	/**
	 * the method findByName of class UserDAO
	 * 
	 * 该方法通过指定用户名称查找用户，用户名不可重复
	 * 
	 * @param name 用户名称
	 * @return 查询到的用户列表
	 */
	public User findByName(String name){	        		 	        
        Transaction transaction=new Transaction();
		User user= hashMap2Object(findByPK("name",getFormatString(name),transaction));
		transaction.close();
		return user;
	}
	
	/**
	 * the method findByPriorityId of class UserDAO
	 * 
	 * 该方法通过参数权限级别的ID查找用户
	 * 
	 * @param priorityId 权限级别的ID
	 * @return 查询到的用户列表
	 */
	public ArrayList<User> findByPriorityId(int priorityId){
		Transaction transaction=new Transaction();
		ArrayList<User> list= 
			list2ObjectList(findByProperty("priorityId", priorityId,transaction));
		transaction.close();
		return list;
	}
		
	/**
	 * the method list2ObjectList of class UserDAO
	 * 
	 * 该方法将存有用户信息的HashMap对象数组转换为User对象数组
	 * 
	 * @param hashMapList HashMap对象数组
	 * @return User对象数组
	 */
	public ArrayList<User> list2ObjectList(ArrayList<HashMap> hashMapList){
		User tempUser=null;
		ArrayList<User> resultList=new ArrayList<User>();
		if(hashMapList.isEmpty())
			return resultList;
		for(Iterator i=hashMapList.iterator();i.hasNext();){
			tempUser=hashMap2Object((HashMap)i.next());
			if(tempUser!=null)
				resultList.add(tempUser);
		}
		return resultList;
	}
	
	/**
	 * the method hashtable2Point of class UserDAO
	 * 
	 * 该方法将Hashtable类型的对象转换为User的对象，并返回User的对象.
	 * 
	 * @param hashtable 存储了一个景点信息的Hashtable类型的对象
	 * @return User的对象.
	 */
	public User hashMap2Object(HashMap hashMap){
		if(hashMap==null)
			return null;
		User user=new User();
		user.setId((Integer)hashMap.get("ID"));
		user.setName((String)hashMap.get("NAME"));
		user.setNickName((String)hashMap.get("NICKNAME"));
		user.setPassword((String)hashMap.get("PASSWORD"));
		user.setProfile((String)hashMap.get("PROFILE"));
		user.setCreateDate((Date)hashMap.get("CREATEDATE"));
		Role role=DAOFactory.getUserGroupDAO().findByUserId(user.getId());
		if(role!=null){
			user.setRole(role);
		}else{
			role=DAOFactory.getRoleDAO().findById(2);
			user.setRole(role);
		}
		return user;
	}
	
	/**
	 * the method object2HashMap of class UserDAO
	 * 
	 * 该方法将参数User对象转换为存储参数User对象信息的HashMap对象，并返回
	 * 
	 * @param point 用户User对象
	 * @return 存储参数用户User对象信息的HashMap对象
	 */
	public HashMap object2HashMap(User user){
		HashMap hashMap=new HashMap();
		hashMap.put("ID", "default");
		hashMap.put("NAME", getFormatString(user.getName()));
		hashMap.put("NICKNAME", getFormatString(user.getNickName()));
		hashMap.put("PASSWORD", getFormatString(user.getPassword()));
		hashMap.put("PROFILE", getFormatString(user.getProfile()));
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
	    String dateString = formatter.format(user.getCreateDate());
		hashMap.put("CREATEDATE", getFormatString(dateString));
		return hashMap;
	}
	
}